|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13.4 Объект NamespaceОбъект Outlook.Namespace, свойства и методы объекта Outlook.Namespace, получение почты и обработка полученных сообщений из VBA, подключение к папке Как уже говорилось выше, в Outlook используется понятие пространств имен - нечто вроде драйверов, которые, по замыслу разработчиков Outlook, должны обеспечивать доступ к различным хранилищам пользовательских данных. У каждого такого драйвера должны быть свои возможности. Однако уже на протяжение долгого времени в Outlook используется единственное пространство имен - MAPI, и пока нет никакой информации о том, что должно появиться что-то еще. Для наших целей пространство имен Outlook можно рассматривать просто как специальный служебный объект, в который "переехали" некоторые свойства и методы объекта Application. Если в вашей программе вам нужны свойства или методы объекта Namespace, получить ссылку на этот объект можно двумя способами:
Set oNameSpace =Application.GetNamespace("MAPI")
Set oNameSpace = Application.Session Эти две строки кода по функциональности полностью равнозначны, но в документации обычно всегда используется только первый способ. Зачем нам нужен объект Namespace? Для выполнения самых распространенных операций с электронной почтой: установка соединения с сервером электронной почты, отправки и получения электронной почты, выбора нужной папки, работы со адресными книгами. Кроме того, объект Namespace представляет еще и виртуальный корень всех папок Exchange, при помощи которого можно циклом проходить по всем папкам в Exchange. Объект Namespace в практической работе используется очень часто. Например, предположим, что вам нужно из Outlook скачать почтовые сообщения для всех учетных записей электронной почты и что-то сделать с каждым полученным сообщением. В нашем примере мы будем просто выводить тему каждого сообщения, на практике, возможно, мы "разбирали" бы каждое сообщение в стандартном формате и помещали из него информацию в базу данных. Такое решение может пригодится при обработке информации, получаемой из филиалов, с Web-сайта предприятия, который находится у провайдера, от торговых представителей, которые находятся в командировке и т.п. Как может выглядеть подобное сообщение? Представим себе, что мы работаем из внешнего приложения. Удобнее всего нам будет использовать форму Word или Excel - чтобы работа с событиями производилась из окна редактора кода. Первое, что нужно сделать - поместить в проект ссылку на объектную библиотеку Microsoft Outlook 11.0 Object Library. Затем мы занимаемся привычным делом - создаем самую обычную форму VBA и помещаем в нее кнопку с именем по умолчанию CommandButton1. После этого можно писать код для нашей формы. Необходимый код для формы с комментариями может выглядеть так: 'Региструем события для некоего абстрактного объекта Outllok.Items 'в разделе ( General ) ( Declarations ) 'После этого объект oItems с событиями появится в окне редактора кода Public WithEvents oItems As Outlook.Items Private Sub CommandButton1_Click() 'Запускаем Outlook Dim oOutlook As New Outlook.Application 'Очень важно: объясняем, что события oItems - это события папки Inbox в Outlook Set oItems = oOutlook.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 'Дальше просто запускаем прием почты со всех учетных записей Dim oNamespace As Outlook.NameSpace Set oNamespace = oOutlook.GetNamespace("MAPI") oNamespace.SyncObjects("Все учетные записи").Start End Sub ': и ловим события появления нового сообщения Private Sub oItems_ItemAdd(ByVal Item As Object) MsgBox Item.Subject End Sub В документации Microsoft для события ItemAdd указано, что оно может не срабатывать, если в папку разом добавляется большое количество элементов, но у меня он всегда работал надежно. Конечно, если у вас на предприятии установлен Exchange Server, то для обработки всей входящей электронной почты правильнее использовать серверные скрипты Exchange и его событийную модель. Но реальная жизнь, как всегда, сложнее. Например, часто за Exchange Server отвечает администратор сети, который совершенно не собирается разрешать разработчикам настраивать на нем какие-то скрипты. Другой вариант - на вашем предприятии работает не Exchange, а, к примеру, почтовая система на Unix - SendMail, PostFix, CommunigatePro или что-нибудь в этом роде. Чтобы разобраться с их событиями, может потребоваться много времени и усилий, а Outlook под рукой всегда. А теперь, как обычно - информация о самых важных свойствах и методах объекта Namespace:
Dim oOutlook As New Outlook.Application Dim oNameSpace As Outlook.NameSpace Dim oAddress As Outlook.AddressList Set oNameSpace = oOutlook.GetNamespace("MAPI") For Each oAddress In oNameSpace.AddressLists Debug.Print oAddress.Name Next В объекте AddressList находится коллекция AddressEntries с объектами AddressEntry , представляющие записи в адресных книгах. При помощи этой объектной "ветви" вы можете программным способом добавлять объекты в адресную книгу, удалять их, изменять свойства и т.п. Если Outlook у вас работает сам по себе, в этом нет никакого смысла - единственной доступной для пользователя адресной книгой будут являться Контакты, с которыми проще работать другим способом (при помощи объектов ContactItem), Но если Outlook подключен к Exchange Server, то эта возможность становится очень интересной.
Set oNameSpace = Application.GetNamespace("MAPI") Set oRecipient = oNameSpace.CurrentUser Debug.Print oRecipient.Address К сожалению, попытка выполнить этот код из внешнего приложения приведет к тому, что появится окно сообщения с вопросом: хотите ли предоставить программе доступ к адресам электронной почты в Outlook? Скорее всего, это окно вам совершенно не нужно, но оно было сделано специально в целях безопасности и избежать его вам не удастся. В вашем распоряжении два варианта: программно имитировать нажатие клавиш <Shift>+<Tab> и <Enter> в этом окне (заботливые разработчики отключили даже горячую клавишу для кнопки Да) или запускать этот код из уже работающего Outlook - тогда предупреждения не возникает. Для программной имитации нажатий клавиш можно использовать объект WshShell объектной библиотеки Windows Script Host, но поскольку при выполнении кода VBA ошибки не происходит, а просто "подвисает" строка Debug.Print oRecipient.Address, то возникают дополнительные сложности.
Обычно в приложениях, использующих объектную модель Outlook, без методов объекта Namespace также не обойтись:
Dim oOutlook As New Outlook.Application Set oNameSpace = oOutlook.GetNamespace("MAPI") Set oInbox = oNameSpace.GetDefaultFolder(olFolderContacts) oInbox.Display
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить этот учебник в формате PDF (Acrobat Reader) или DOC (Microsoft Word) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||